python list.append()方法的陷阱:前面的数据被后面的数据覆盖的分析

问题描述

使用 list 的append() 方法,前边的数据总是被后边的数据覆盖

有问题代码

def process():
	proxies = {'180.97.104.97:80': '{"proxy": "180.97.104.97:80"}', \
	'123.125.114.18:80': '{"proxy": "123.125.114.18:80"}', \
	'123.125.115.242:80': '{"proxy": "123.125.115.242:80"}'}

	proxy_dict = {}	# 在循环外部定义字典
	cnt = 0
	proxy_list = []
	for proxy in proxies:
		print(proxy)
		ip, port = proxy.split(":")
		proxy_dict['ip'] = ip
		proxy_dict['port'] = port
	
		proxy_list.append(proxy_dict)
		cnt += 1

	print('total ip: ', cnt)

	return proxy_list

good_proxy = process()
print(good_proxy)

执行结果

发现list 中的数据全都是字典的最后一个数据。

[root@2c9a57af434c test]# python test.py 
total ip:  3
[{'ip': '123.125.115.242', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}]

解决方法

代码


```python
def process():
	proxies = {'180.97.104.97:80': '{"proxy": "180.97.104.97:80"}', \
	'123.125.114.18:80': '{"proxy": "123.125.114.18:80"}', \
	'123.125.115.242:80': '{"proxy": "123.125.115.242:80"}'}

	
	cnt = 0
	proxy_list = []
	for proxy in proxies:
		proxy_dict = {} # 字典定义在循环内部
		ip, port = proxy.split(":")
		proxy_dict['ip'] = ip
		proxy_dict['port'] = port
	
		proxy_list.append(proxy_dict)
		cnt += 1

	print('total ip: ', cnt)

	return proxy_list

good_proxy = process()
print(good_proxy)

执行结果

字典中的每一个元素,被放在list 中。

[root@2c9a57af434c test]# python test.py 
total ip:  3
[{'ip': '180.97.104.97', 'port': '80'}, {'ip': '123.125.114.18', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}]

解释

dict 定义在循环外,只有一个地址,每次循环,地址不变,所以覆盖了前边的数据。可以从浅拷贝和深拷贝的方面来理解。

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。

  • copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
  • copy.deepcopy 深拷贝 拷贝对象及其子对象
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值