我该如何修复这个Python变量问题?
好的,如果你在Python中运行下面的代码,它只会打印出问题变量的第一个字母,但后面的内容都能正常打印。这个情况只发生在我把for循环放在Python脚本里面的时候。有没有什么办法可以解决这个问题,让整个问题变量都能打印出来呢?
import random
global nouns
global verbs
global question
nouns =["website","browser","server","printer","computer","disc","software","desktop","a internet connection","the internet","site","forum","smf forum","phpbb forum","money making website","money making blog","firefox","chrome","opera","",""]
verbs = ["cosntruct","build","create","design","update","reconstruct","clean","fix","repair","browse","discover","formualte","form","plan"]
question = ["How do I","How would I", "how do i", "how would i", "what is a", "what is the", "how would i", "how should i", "when does a", "When does a", "How should I"]
def q_gen():
global nouns
global verbs
global question
noun_pick = random.choice(nouns)
verb_pick = random.choice(verbs)
question = random.choice(question)
create = question+" "+verb_pick+" "+noun_pick+"?"
print create
num_count = 0
for num_count in range(1, 100):
num_count=num_count+1
q_gen()
2 个回答
这一行代码修改了你的全局变量:
question = random.choice(question)
第一次运行时,random.choice接收到的是一个字符串,而不是一个列表,所以它会随机选择一个字母。从那以后,random.choice接收到的都是单个字符的字符串,因此它总是使用同一个字母。
这个错误发生是因为你不必要地使用了global
。如果不写global,代码会因为问题被修改而出现编译错误。
下面是没有使用global
的代码:
import random
nouns =["website","browser","server"]
verbs = ["construct","build","create"]
question = ["How do I","How would I", "how do i"]
def q_gen():
noun_pick = random.choice(nouns)
verb_pick = random.choice(verbs)
question_pick = random.choice(question)
create = question_pick+" "+verb_pick+" "+noun_pick+"?"
print create
for num_count in range(1, 100):
q_gen()
这个问题发生的原因是你在这一行把全局变量 question
用它自己的一个值覆盖了:
question = random.choice(question)
这意味着接下来发生了以下情况:
question = [...] # question is a list of strings
question = random.choice(question) # question is a single string
question = random.choice(question) # question is a character from that string
解决办法是把变量名换成其他的名字:
question_pick = random.choice(question)
create = question_pick+" "+verb_pick+" "+noun_pick+"?"
一些关于代码风格的建议
你可以对代码进行一些改进。这些改动可以提高可读性、性能,并让你的代码更符合常规写法。
声明变量。 在Python中不需要这样做。当你给一个变量赋值时,它就会自动创建。这也适用于
for
循环。global a # Unnecessary and dangerous a = 0
迭代。 当你写
for x in ...
时,你是在重复执行一系列语句。每次执行这段代码时,x
会被赋值为下一个项目。你不需要自己去赋值或增加x
的值。x = 0 # Not necessary; x is about to be assigned to the first # element of range(10), which is 0 for x in range(10): ... x = x + 1 # Not necessary; as soon as this statement is done, # x will be assigned to the next element of range(10)
全局变量。
你不需要它们。 当你使用
name = ...
时,你是在创建一个模块级别的变量。每个变量在你的模块中(也就是当前的 .py 文件)都是可以访问的。它们很危险。 如果其他模块也在使用一个叫
name
的变量,你可能会遇到意想不到的问题。如果你打算进一步开发这段代码,请记住这一点。
字符串格式化。 这个概念是你创建一个模板,然后在想要插入值的地方放置标签。
%s
标签的意思是“把下一个变量当作字符串来处理,并放在这里”。create = "%s %s %s?" % (question, verb_pick, noun_pick)
风格。 Python 有一个叫做 PEP 8 的风格指南。确保你的代码遵循 PEP 8,可以让代码更易读,并且看起来更像其他 Python 代码。例如,运算符前后应该有一个空格,逗号后面也应该有一个空格,等等。