zgm6631 2024-05-06 19:57 采纳率: 75%
浏览 0
已结题

python列表增加元素问题

#python:空列表增加元素时,此时元素也是一个列表,元素列表为何会被改变?
#

str1='45.20.171.50,1.1.1.1'
mylist=[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1' ]
mylist1=[]
list6=str1.split(',')

for j in range(0,2):
    mylist1.append(mylist)
    print(mylist)
    print(mylist1)
    mylist1[j][6]=list6[j]
    print(mylist1)

PS C:\Users\gloria> & "E:/Program Files (x86)/Python310/python.exe" f:/python/1.py
[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1']--------------元素列表
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1']]-------------空列表增加了元素,新列表
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50']]------------新列表修改最后一个内容
[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50']-------------元素列表为何为修改了?
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50'], [6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50']]
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '1.1.1.1'], [6, 663628395370, '77900247092', 'I', 'IP', '20M', '1.1.1.1']]
----------------------------------------------新列表[0][6]为何也被改了?
PS C:\Users\gloria>


#我想要的结果是:
[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1']--------------元素列表
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1']]-------------空列表增加了元素,新列表
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50']]------------新列表修改最后一个内容
经过2次循环后,新列表最终变成下面这样
[[6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50'], [6, 663628395370, '77900247092', 'I', 'IP', '20M', '1.1.1.1']]
元素列表内容不变
```python



```

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-06 19:57
    关注

    引自免费微信小程序:皆我百晓生

    在你的代码中,问题出在mylist1.append(mylist)这行。这里你将 mylist 直接添加到了 mylist1 中,但需要注意的是,Python 的列表赋值操作实际上是引用复制,而不是创建一个新的副本。这意味着当你后续修改 mylist1 中的某个元素(如 mylist1[j][6]),实际上也在修改原始的 mylist

    要解决这个问题,你需要在添加到 mylist1 之前,对 mylist 进行一个浅复制,确保每个插入的列表都是独立的。可以使用切片操作 [:] 来实现这个目的,它会创建一个新的列表副本。

    以下是修改后的代码:

    str1 = '45.20.171.50,1.1.1.1'
    mylist = [6, 663628395370, '77900247092', 'I', 'IP', '20M', '45.20.171.50,1.1.1.1']
    mylist1 = []
    list6 = str1.split(',')
    
    for j in range(0, 2):
        # 使用切片操作进行浅复制
        copied_list = mylist[:]
        mylist1.append(copied_list)
        print(mylist)
        print(mylist1)
        # 现在修改 copied_list,不会影响 mylist
        copied_list[6] = list6[j]
        print(mylist1)
    

    运行这段修改后的代码,你会得到期望的结果。每次循环,新的子列表都会从原始列表的一个副本开始,因此修改其中一个子列表不会影响其他子列表或原始列表。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?