关于Python generator的问题
本帖最后由 bayernerxz 于 2021-2-3 12:46 编辑下面第一段代码中的t,为什么会跟随factor变化指向而变化,而第二段的t并不会随arr1而变化?
新人第一次发贴,有什么不足请多指教。谢谢!
第一段代码:
def triangles():
factors = []
while True:
ref_List = factors
i = len(factors)
factors.append(1)
while i > 0:
if i >= 2:
factors = ref_List+ref_List
i = i-1
yield factors
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
第二段代码
def triangles():
arr1 =
while True:
arr2 = ]
for i, value in enumerate(arr1):
if i > 0:
arr2.append(arr1 + arr1)
arr2.append(arr1[-1])
yield arr1
arr1 = arr2
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
第一段代码只加1...... ncx0331 发表于 2021-2-3 12:34
第一段代码只加1......
这个是我作的廖雪峰老师的作业。解决方法就是
yield
我把打印的代码也编辑进去了,并不是全是1,而是下面的列表打印了10次。
用debugger看了一下,在factor变成后,Global里的t就突然从变成了。而第二段代码中直接引用的arr1并不会让t突然变化。
就是这一点怎么也想不通。 我又想了一下,原因应该是
factors = ref_List+ref_List
这个语句,把factor和t指向的常量池里的list的值改变了,导致t也同时被改变。
而arr2.append(arr1 + arr1)这个语句,是不是不改变常量池里的list,而是产生一个新的list常量,给arr2去赋值。
用print(id(t)) 和print(id(factors))和print(id(arr1))分别测试了一下,应该就是这个原因。
页:
[1]