繁体   English   中英

为什么 python 不打印我写入的所有内容?

[英]Why doesn't python print everything I wrote into it?

我在 python python 做一些练习,我遇到了一个问题。 我已经打印了一个反转的列表,我也想在不同的行中打印反转的元素,但由于某种原因它只打印第一个,如果我把第一个打印到评论中,它打印出循环就好了。 为什么?


def main():
    pass
if __name__ == '__main__':
    main()

list1 = [10, 20, 30, 40, 50]

def reverse_list(l1):
    l2 = []
    for i in range(len(l1)):
        l2.append(l1.pop())
    return l2

print(reverse_list(list1))

pass

def reverse_print(l):
    listr = reversed(l)
    for j in listr:
        print(j)

reverse_print(list1)

print("Complete...")

python中,数据类型分为可变不可变类型:

  • Mutable object : object指向的memory中的值可以改变
  • Immutable object:object指向的memory中的值是不能改变的,所以当变量指向的值发生变化时,相当于把原来的值复制一份,存入新的地址,变量指向这个新地址。
a = [1,2,3,4]
a_ref = a
print(a) # [1,2,3,4]
a_ref[0] = 5
print(a) # [5,2,3,4]

从上面的代码可以看出

  1. a, a_ref 完全一样
  2. a 和 a_ref 具有相同的 memory 位置
  3. 修改a_ref,a也会改变

例如:

a = [1,2,3,4]
def somefunc(a2):
    a2.append(5)
print(a) # [1,2,3,4]
somefunc(a)
print(a) # [1,2,3,4,5]

通常,它不会通过调用somefunc(a)来改变 a

由于a2是对a的引用,指向同一个memory位置,所以修改a2时,也会修改为a

在你的代码中:
当你调用reverse_list(list1)时,l1 是对 list1 的引用,当你从 l1 中弹出元素时,它也会弹出 list1 中的元素

所以在调用reverse_list(list1)之后,list1 是空的,这就是为什么reverse_print(list1)不打印任何东西

解决方案

def reverse_list(l1):
    l1_copy = l1[:] # copy the whole list
    l2 = []
    for i in range(len(l1_copy)):
        l2.append(l1_copy.pop())
    return l2

当您调用l1_copy = l1[:]时,l1_copy 不会指向相同的 memory 位置,因此在修改 l1_copy 时 l1 和 list1 不会被修改

PS:英语是我的第二语言,所以可能有一些语法错误,请原谅

在第二次打印时, list1已通过使用reverse_list中的pop()方法清空。

要反转列表,也许您应该使用reverse()方法,如下例所示:

List1 = [1,2,3]
List1.reverse()
print(List1) # [3,2,1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM