【发布时间】:2019-07-24 18:48:13
【问题描述】:
我正在用 Python (Mastermind) 制作新程序。我对变量的引用有疑问:
def user_turn():
try_counter = 1
user_code = []
guessed_code = random_code()
print("Twoja kolej na zgadywanie!")
while try_counter <= max_tries and user_code != guessed_code:
good_number, good_number_and_position = 0, 0
appearance_types_guessing_code = [0 for i in range(types)]
appearance_types_user_code = [0 for i in range(types)]
user_code = input("Próba nr {}: ".format(try_counter))
user_code = list(map(int, str(user_code)))
count_xos()
print_xos()
try_counter += 1
print_result_user_turn()
函数体print_xos():
def print_xos():
for i in range(good_number_and_position):
print("x", end='')
for i in range(good_number):
print("o", end='')
print("")
我的问题是函数print_xos() 中的变量good_number 和good_number_and_position 是未知的,尽管事实上我在函数user_turn() 的主体的while 循环中声明了这个变量。我怎么解决这个问题?我不想将引用作为函数的参数发送。在我看来,它并不优雅。是否有可能以其他方式做到这一点?
编辑:
好的,那我稍微改了一下代码:
def user_turn():
try_counter = 1
user_code = []
guessed_code = random_code()
appearance_types_guessed_code = [0] * types
how_many_appearance(guessed_code, appearance_types_guessed_code)
print("Twoja kolej na zgadywanie!")
while try_counter <= max_tries and user_code != guessed_code:
good_number, good_number_and_position = 0, 0
appearance_types_user_code = [0] * types
user_code = input("Próba nr {}: ".format(try_counter))
user_code = list(map(int, str(user_code)))
how_many_appearance(user_code, appearance_types_user_code)
print(appearance_types_guessed_code, appearance_types_user_code)
count_xos(guessed_code, appearance_types_guessed_code, user_code, appearance_types_user_code, good_number, good_number_and_position)
print(good_number_and_position, good_number)
print_xos(good_number_and_position, good_number)
try_counter += 1
print_result_user_turn(guessed_code, user_code)
还有函数体count_xos:
def count_xos(guessed_code, appearance_types_guessed_code, user_code, appearance_types_user_code, good_number, good_number_and_position):
for i in range(len(appearance_types_guessed_code)):
good_number += np.min([appearance_types_guessed_code[i], appearance_types_user_code[i]])
for i in range(code_size):
if guessed_code[i] == user_code[i]:
good_number_and_position += 1
good_number -= 1
print(good_number_and_position, good_number)
我得到了这个输出:
RUNDA 1
Twoja kolej na zgadywanie!
Próba nr 1: 0011
[0, 2, 0, 1, 0, 0, 0, 1, 0, 0] [2, 2, 0, 0, 0, 0, 0, 0, 0, 0]
1 1
0 0
您可以确定函数 count_xos 计数 good_number,good_number_and_position 计数正确。应该是1 1,但是不知道为什么运行count_xos方法后,变量good_number_and_position、good_number没有变化?
【问题讨论】:
-
恰恰相反,优雅的解决方案是让您的函数接收这些值作为参数,而不是依赖那些在函数外部设置为全局变量的值。
-
作为旁注,
[0 for i in range(types)]最好写成[0] * types -
阅读Scoping rules - 最好保持范围尽可能小,并为他们需要的功能提供数据。很少需要做某事
global。
标签: python python-3.x variables global local