Python 中的命名空间/作用域混淆

问题描述 投票:0回答:1

在我的 Jupyter 笔记本(Python 3)中,我一遍又一遍地使用变量

kk

kk = 7
for kk in range(2): # ranging from 0 to 1
    for kk in range(90,92): # ranging from 90-91
        for kk in range(10,12): # ranging from 10-11
            print(kk)
kk

据我了解,

for kk in range(2)
循环使用自己的
kk
变量(范围),并且不关心上面定义的
kk
,也不关心其他循环中的
kk
for kk in range(90,92)
循环和
for kk in range(10,12)
循环也是如此。为什么他们都覆盖了全局定义的
kk
,使得最终的
kk
是11,但他们却从不读取全局的
kk

我正在尝试理解范围和名称空间。但我预料到了:

  1. 没有一个循环会覆盖全局
    kk
    ,因为它们在自己的作用域中使用
    kk
    (这是我所期望的,因为 Python 中的 命名空间和作用域);或
  2. 循环应在第一次迭代后结束,因为
    kk
    现在设置为
    10
    ,它位于最外层循环所需的范围之外。

我认为Python中的作用域和命名空间试图解释它,但我不明白。

python
1个回答
0
投票

那么 kk 会改变每个循环的每一步。

for 不像 C++ 或 C# 中那样是静态的,所以它实际上并不关心 kk 是否在中间发生变化。

kk = 7 # Here it is 7


for kk in range(2): 
    # Here kk is 0
    for kk in range(90,92): 
        # Here kk is 90 
        for kk in range(10,12):
            # Here kk is 10 and 11
            print(kk) # <- 10\n11
# Now it goes for the second loop
    for kk in range(90,92): 
        # Here kk is 91
        for kk in range(10,12):
            # Here kk is 10 and 11
            print(kk) # <- 10\n11
# Now the inner loop is finished so it goes all over again


for kk in range(2): 
    # Here kk is 1
    for kk in range(90,92): 
        # Here kk is 90 
        for kk in range(10,12):
            # Here kk is 10 and 11
            print(kk) # <- 10\n11
# Now it goes for the second loop
    for kk in range(90,92): 
        # Here kk is 91
        for kk in range(10,12):
            # Here kk is 10 and 11
            print(kk) # <- 10\n11

# Now the outer loop has finished so the job is finished, last kk value is 11
# Since you implemented kk before the loops the last value is not lost.

Python 不关心你在循环中使用什么变量。

例如

some_list = [1,2]

for item in some_list:
    some_list.remove(item) # <- this will work but once

这将适用于一次迭代,1 将被 2 删除,因为 python 从索引 0 -> 1 -> 2 开始,因为它找到了索引 0,它进行了迭代,然后找不到索引 1,所以它已经结束

如果你去

some_list = [1,2]

for item in some_list:
    some_list.append(item)

你将得到 [1, 2, 1, 2, 1, 2, ...] 的无限循环

因为您使用 range(X),它只是创建一个数字列表,然后使用该列表,因此不存在过度使用 kk 的问题,但每个循环都会丢失以前的值。

© www.soinside.com 2019 - 2024. All rights reserved.