V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  diydry  ›  全部回复第 4 页 / 共 4 页
回复总数  70
1  2  3  4  
2016-11-21 16:18:09 +08:00
回复了 woniu127 创建的主题 Python python append 为何如此奇怪?
对象变动(Mutation)
Python 中可变(mutable)与不可变(immutable)的数据类型让新⼿很是头痛。 简单的说, 可
变(mutable)意味着"可以被改动", ⽽不可变(immutable)的意思是“常量(constant)”。 想把脑
筋转动起来吗? 考虑下这个例⼦:
foo = ['hi']
print(foo)
# Output: ['hi']
bar = foo
bar += ['bye']
print(foo)
# Output: ['hi', 'bye']
刚刚发⽣了什么? 我们预期的不是那样!我们期望看到是这样的:
foo = ['hi']
print(foo)
# Output: ['hi']
bar = foo
bar += ['bye']
print(foo)
# Output: ['hi']
print(bar)
# Output: ['hi', 'bye']
这不是⼀个 bug 。 这是对象可变性(mutability)在作怪。 每当你将⼀个变量赋值为另⼀个可
变类型的变量时, 对这个数据的任意改动会同时反映到这两个变量上去。 新变量只不过是
⽼变量的⼀个别名⽽已。 这个情况只是针对可变数据类型。 下⾯的函数和可变数据类型让
你⼀下就明⽩了:
def add_to(num, target=[]):
target.append(num)
return target
add_to(1)
# Output: [1]
add_to(2)
# Output: [1, 2]
add_to(3)
# Output: [1, 2, 3]
Python 进阶
对象变动 Mutation 51 你可能预期它表现的不是这样⼦。 你可能希望, 当你调⽤add_to 时, 有⼀个新的列表被
创建, 就像这样:
def add_to(num, target=[]):
target.append(num)
return target
add_to(1)
# Output: [1]
add_to(2)
# Output: [2]
add_to(3)
# Output: [3]
啊哈!这次又没有达到预期, 是列表的可变性在作怪。 在 Python 中当函数被定义时, 默认
参数只会运算⼀次, ⽽不是每次被调⽤时都会重新运算。 你应该永远不要定义可变类型的
默认参数, 除⾮你知道你正在做什么。 你应该像这样做:
def add_to(element, target=None):
if target is None:
target = []
target.append(element)
return target
现在每当你在调⽤这个函数不传⼊target 参数的时候, ⼀个新的列表会被创建。 举个例
⼦:
add_to(42)
# Output: [42]
add_to(42)
# Output: [42]
add_to(42)
# Output: [42]
2016-10-17 10:17:01 +08:00
回复了 dongweiming 创建的主题 推广 赠送几本《Python Web 开发实战》
24
初创手游公司,目测朝九晚八。
2016-09-06 18:08:17 +08:00
回复了 BruceAuyeung 创建的主题 Linux 显卡这么差的刀片机安装什么样的桌面发行版能流畅运行?
+1 ,为什么非要装桌面呢?
2016-08-23 17:39:22 +08:00
回复了 david2016 创建的主题 程序员 各位有没有程序员后来转行了,或是身边的朋友?
肯定有啊。我认识个做程序员后来转行开茶叶店的。
wings 强,无敌。。。
2016-07-09 11:44:01 +08:00
回复了 Ignorant 创建的主题 程序员 想勾搭一个愿意一起创业的程序员
看起来挺有意思的。可以尝试,加油。
这种公司等着倒闭把。
1  2  3  4  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1135 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
Developed with CodeLauncher
♥ Do have faith in what you're doing.