bayernerxz 发表于 2021-2-3 11:11:53

关于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)

ncx0331 发表于 2021-2-3 12:34:12

第一段代码只加1......

bayernerxz 发表于 2021-2-3 12:50:15

ncx0331 发表于 2021-2-3 12:34
第一段代码只加1......

这个是我作的廖雪峰老师的作业。解决方法就是

yield

我把打印的代码也编辑进去了,并不是全是1,而是下面的列表打印了10次。



用debugger看了一下,在factor变成后,Global里的t就突然从变成了。而第二段代码中直接引用的arr1并不会让t突然变化。

就是这一点怎么也想不通。

bayernerxz 发表于 2021-2-3 13:44:57

我又想了一下,原因应该是
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]
查看完整版本: 关于Python generator的问题