Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于dict.update方法,何时在dict上使用键值对?_Python_Python 3.x_Dictionary - Fatal编程技术网

Python 对于dict.update方法,何时在dict上使用键值对?

Python 对于dict.update方法,何时在dict上使用键值对?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我注意到你可以做两件事来更新一本字典,而且它们似乎有相同的结果: a = {} a.update({'foo': 1}) a = {} a.update(foo = 1) 这两种方法都会产生一个类似以下内容的词典: {'foo': 1} 是否有任何理由更喜欢使用字典或键/值对作为更新方法?它们在功能上是否完全相同,或者是否存在一种语法可能导致的“gotcha”?使用一种语法而不是另一种语法可能有不同的原因。例如: >>> d = {} >>> d.upd

我注意到你可以做两件事来更新一本字典,而且它们似乎有相同的结果:

a = {}
a.update({'foo': 1})

a = {}
a.update(foo = 1)
这两种方法都会产生一个类似以下内容的词典:

{'foo': 1}

是否有任何理由更喜欢使用字典或键/值对作为更新方法?它们在功能上是否完全相同,或者是否存在一种语法可能导致的“gotcha”?

使用一种语法而不是另一种语法可能有不同的原因。例如:

>>> d = {}
>>> d.update(a=2)        # looks much cleaner
>>> d.update({'a': 2})   # We need to unnecessarily write a few more characters,
但是,如果我想更新str类型以外的密钥:

>>> d = {}
>>> d.update(2='a')      # Gives a syntax error
>>> d.update({2: 'a'})   # is the only way
此外,还可以存储
dict
,因此如果需要通过变量进行更新:

>>> u = {'a': 2}
>>> d = {}
>>> d.update(u)          # clean
>>> d.update(**u)        # Essentially same as using keyword argument form, but unnecessary
另一种情况是,当您手动更新某些键,但从变量更新其他键时,关键字参数形式更简洁:

>>> u = {'a': 2}
>>> d = {}
>>> d.update(b=3, **u)
# Whereas to use `dict` form:
>>> d.update({'b': 3, **u})   # Introduces unnecessary clutter
是否有任何理由更喜欢使用字典或键/值对作为更新方法

您已经有了一个dict,例如,如果您有一个基本dict和另一个dict(来自常数或参数),则
dict1.update(dict2)
非常有意义

如果动态生成第二个dict,例如
dict1.update(zip(键、值))
,也有意义

它们在功能上是否完全相同,或者是否存在一种语法可能导致的“gotcha”

“关键字参数”表单仅适用于字符串键(在Python3中,在Python2中,它无意中也适用于非字符串键)。甚至使用映射解包表单。它也不能与文字关键字一起使用,例如

d.update(assert=3)
是一个语法错误

更一般地说

关键字表单本身是无用的 使用位置参数将关键字添加到
update
调用中是有意义的,例如

d.update(d2,key=value)
因为你已经在接一个必要的电话了。然而

d.update(key=value)
通常[0]只是一种更复杂、更具限制性和更慢的书写方式

d['key']=值
```:
```嘘
❯ python3-mtimeit-s“d={'a':'b'}”“d.update(c='d',e='f',g='h')”
2000000个回路,最佳值为5:202纳秒/回路
❯ python3-mtimeit-s“d={'a':'b'}”“d['c']='d';d['e']='f';d['g']='h'”
5000000个回路,最佳5个:每个回路62.2纳秒
我不记得这些数字了(它们可能随着最新版本的发布而改变,因为对文字指令进行了优化),但几年前当我把它放在板凳上时,你需要几十把钥匙才能收支平衡


[0]它在需要在表达式上下文(例如lambda body)中更新dict的罕见情况下非常有用,我认为我从未遇到过这种情况

一个区别是,当使用命名关键字时,只能更新有效python名称的关键字。要更新任何其他键,如整数、元组、字符串等不是有效的python名称,您需要使用字典。我同意key-value方法更干净、更美观。我只是想知道这样做会不会有什么问题。我想只要我希望使用的键不是像“list”或“dict”之类的保留字,只要它的计算结果是字符串,它就应该完全可以了?
list
dict
都不是保留字
def
class
是。您可以使用python中有效变量名的任何字符串进行更新。“使用静态和少量kvs的dict.update(任何一种形式)都是愚蠢的。”如果您有一个函数,根据特定条件使用一组不同的键填充dict,该怎么办?例如,如果a==1:d.update(foo=1)
elif a==2:d.update(bar=1)
。我想,在你开始那些作业之前,你可以用
d={foo=0,bar=0}
填充dict,但在dict较大的情况下,这不是用内存交换速度吗?这个例子毫无意义,如果a==1:d['foo']=1,它是
更复杂、更慢的版本;elif a==2:d['bar']=1