python局部变量-何时必须赋值?

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

我是一名业余程序员,希望在学习代码时寻求建议。这里我遇到了一些问题

我发现,当我删除注释“#X=3”并从下面将其转换为代码时,代码就工作了。如果没有X=3,代码将导致UnboundLocalError

在网上浏览,它与全局变量和局部变量有关,但我看不出它是如何相关的。什么时候X必须在while循环之前表示?为什么“对于素数中的y”不需要预先定义“y”

代码的主要用途:计算素数的#到(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)