簡體   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