我正在尝试一些各种单行解决方案来解决定义变量的问题,只有当它还不存在时才注意到Python会以不同方式处理dicts和lists/tuples.这些错误似乎与我完全平行,所以我很困惑为什么会出现差异.
字典KeyError处理
existing_dict = {"spam": 1, "eggs": 2}
existing_dict["foo"] = existing_dict["foo"] if not KeyError else 3
Run Code Online (Sandbox Code Playgroud)
返回 {"spam": 1, "eggs": 2, "foo": 3}
请注意,我在左侧和右侧都引用了一个不存在的键; Python在出现的任一子句中处理KeyError都没有问题.
List IndexError Handling(对于元组也是如此)
existing_list = ["spam","eggs"]
existing_list[2] = existing_list[2] if not IndexError else ["foo"]
Run Code Online (Sandbox Code Playgroud)
返回 IndexError: list assignment index out of range
解决这个特定错误并不困难(这里回答),但我很好奇为什么这些情况有所不同.在这两种情况下,似乎在受让人/赋值条款中都存在错误,其中一个"if not"错误捕获.
在这两种情况下,KeyError并且IndexError是只类的,都是真实的:
>>> bool(KeyError)
True
>>> bool(IndexError)
True
Run Code Online (Sandbox Code Playgroud)
所有类对象在Python中都测试为true,请参阅真值测试.
您不能使用条件表达式来测试异常; 对于这两个您的例子中,else值回升始终,然后被分配; 你的测试完全等同于:
existing_dict["foo"] = 3
existing_list[2] = ["foo"]
Run Code Online (Sandbox Code Playgroud)
您可以使用异常处理,或使用长度测试.
导致异常的原因是,只有索引已存在,才能分配到列表索引:
>>> empty = []
>>> empty[0] = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
Run Code Online (Sandbox Code Playgroud)
这只是字典和列表工作方式的不同之处; 您可以附加的列表,这将增加索引的数量.您不能使用字典(没有顺序)执行此操作,因此要添加需要分配给它的新键值对.另一方面,如果列表支持任意索引分配,那么两者之间的所有索引会发生什么?如果列表为空但您已分配到索引42,该怎么办?指数0-41会发生什么?
用try/ 抓住异常except:
try:
existing_list[2] = "foo"
except IndexError:
existing.append('foo')
Run Code Online (Sandbox Code Playgroud)
这将替换索引2处的现有值,或者如果索引尚不存在则附加.
您可以尝试测试长度:
if len(existing_list) <= 3:
existing_list.append('foo')
Run Code Online (Sandbox Code Playgroud)
并且仅在尚未存在至少3个元素时才附加.
对于词典,测试密钥:
if 'foo' not in existing_dict:
existing_dict['foo'] = 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1096 次 |
| 最近记录: |