<p>两个(甚至三个)同名的不同变量<code>anekdots</code>存在问题</p>
<p>存在全局变量</p>
<pre><code>anekdots = []
</code></pre>
<p>局部变量</p>
<pre><code>anekdots = anekdot_script(...)
</code></pre>
<p>它实际上不是局部变量,而是在</p>
<pre><code>async def anekdot(..., anekdots = ...)
</code></pre>
<p>所有这些都会造成混乱,因为您认为您分配给了全局变量,但代码将其分配给了局部变量,下次它再次使用<code>anekdots = []</code>时,它运行<code>anekdot_script()</code>,并再次读取所有笑话</p>
<p>这对我有用</p>
<pre><code>anekdots = []
n_of_page = 1
@bot.command()
async def anekdot(ctx):
global anekdots # inform function that `anekdots = ...` has to assign to global variable instead of creating local one
global n_of_page # inform function that `n_of_page = ...` has to assign to global variable instead of creating local one
anekdots, n_of_page = anekdot_script(anekdots, n_of_page)
</code></pre>
<p>与</p>
<pre><code>def anekdot_script(anekdots, n_of_page):
# ... code ...
return anekdots, n_of_page # need to return also `n_of_page`
</code></pre>
<hr/>
<p>完整的工作代码,但在命令<code>!anekdot</code>中没有额外的参数</p>
<pre><code>import discord
from discord.ext import commands
import requests
from bs4 import BeautifulSoup
def anekdot_script(anekdots, n_of_page): #return list of anekdots of a specific page
url = 'https://humornet.ru/anekdot/evrei/page/{}/'
if not anekdots:
response = requests.get(url.format(n_of_page)) #getting page info
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml') #parses the page to html format
anekdots = soup.select('.text') #anekdots have class 'text' on this page
n_of_page += 1
return anekdots, n_of_page # need to return also `n_of_page`
bot = commands.Bot(command_prefix= '!')
anekdots = []
n_of_page = 1
@bot.command()
async def anekdot(ctx):
global anekdots # inform function that `anekdots = ...` has to assign to global variable instead of creating local one
global n_of_page # inform function that `n_of_page = ...` has to assign to global variable instead of creating local one
anekdots, n_of_page = anekdot_script(anekdots, n_of_page)
if anekdots:
await ctx.send(type(anekdots))
await ctx.send(anekdots[0].text)
anekdots.pop(0)
await ctx.send(len(anekdots))
else:
await ctx.send('Nothing left! Find new web-site!')
import os
TOKEN = os.getenv('DISCORD_TOKEN')
bot.run(TOKEN)
</code></pre>