python局部变量-何时必须赋值?
我是一名业余程序员,希望在学习代码时寻求建议。这里我遇到了一些问题 我发现,当我删除注释“#X=3”并从下面将其转换为代码时,代码就工作了。如果没有X=3,代码将导致UnboundLocalError 在网上浏览,它与全局变量和局部变量有关,但我看不出它是如何相关的。什么时候X必须在while循环之前表示?为什么“对于素数中的y”不需要预先定义“y” 代码的主要用途:计算素数的#到(num)python局部变量-何时必须赋值?,python,global-variables,local-variables,Python,Global Variables,Local Variables,我是一名业余程序员,希望在学习代码时寻求建议。这里我遇到了一些问题 我发现,当我删除注释“#X=3”并从下面将其转换为代码时,代码就工作了。如果没有X=3,代码将导致UnboundLocalError 在网上浏览,它与全局变量和局部变量有关,但我看不出它是如何相关的。什么时候X必须在while循环之前表示?为什么“对于素数中的y”不需要预先定义“y” 代码的主要用途:计算素数的#到(num) def count_primes2(num): 素数=[2] #x=3 如果num
def count_primes2(num):
素数=[2]
#x=3
如果num<2:
返回0
while x要展开,因为在while循环条件中使用了x,是的,必须先定义它。您不需要在for循环之前定义y
,因为primes
行中的for y将y
定义为列表中的每个项目
简略地翻译成通俗易懂的英语:
while x要展开,因为您在while循环条件中使用了x,是的,必须先定义它。您不需要在for循环之前定义y
,因为primes
行中的for y将y
定义为列表中的每个项目
简略地翻译成通俗易懂的英语:
而x根据设计模式变量应在使用前创建。在代码中,您正在使用x,而没有创建或初始化默认值。
“y”=您正在迭代列表(素数)。因此,在每次迭代中,y将由当前值初始化。因此它不会给出任何错误。根据设计模式,应在使用前创建变量。在代码中,您正在使用x,而没有创建或初始化默认值。
“y”=您正在迭代列表(素数)。因此,在每次迭代中,y将由当前值初始化。因此它不会给出任何错误。在使用变量之前,您需要创建(并为其赋值)。如果在创建变量之前尝试使用变量的值,则会出现异常。您在while
表达式中就是这样做的:您询问它的值是否低于或等于num
,但它甚至还不存在,它没有值,这会引发异常
现在,为什么会出现取消绑定的LocalError
在执行代码之前,编译器会检查代码。在这个编译步骤中,它注意到您在函数的某个地方为X
赋值,即在X+=2
行中。(甚至有两个)这将编译器的变量标记为局部变量
因此,如果在赋值之前尝试访问该变量,该变量还不存在,但代码已经知道该变量应该是局部变量,因此出现UnboundLocalError
如果函数中没有对X
的赋值语句,则会出现名称错误
,因为在执行while
语句期间,解释器会搜索此名称的全局变量。在使用变量之前,需要创建变量(并为其赋值)。如果在创建变量之前尝试使用变量的值,则会出现异常。您在while
表达式中就是这样做的:您询问它的值是否低于或等于num
,但它甚至还不存在,它没有值,这会引发异常
现在,为什么会出现取消绑定的LocalError
在执行代码之前,编译器会检查代码。在这个编译步骤中,它注意到您在函数的某个地方为X
赋值,即在X+=2
行中。(甚至有两个)这将编译器的变量标记为局部变量
因此,如果在赋值之前尝试访问该变量,该变量还不存在,但代码已经知道该变量应该是局部变量,因此出现UnboundLocalError
如果函数中的X
没有任何赋值语句,您可能会得到namererror
,因为在执行while
语句期间,解释器会搜索此名称的全局变量。因为您在while循环条件中使用X
,是,它必须在之前定义。对于素数中的y
本身定义了y
;for
循环是一种赋值语句。@supersew,所以在while X循环之前处理X是一种常见的做法?我能简单地确认变量必须在每次while循环之前表示吗?@chepner,我明白了。再次感谢您在while循环条件中使用了x
,是的,它必须在之前定义。对于素数中的y
本身定义了y
;for
循环是一种赋值语句。@supersew,所以在while X循环之前处理X是一种常见的做法?我能简单地确认变量必须在每次while循环之前表示吗?@chepner,我明白了。再次感谢
def count_primes2(num):
primes = [2]
#x = 3
if num < 2:
return 0
while x <= num:
for y in primes: # use the primes list!
if x%y == 0:
x += 2
break
else:
primes.append(x)
x += 2
print(primes)
return len(primes)