Python文档似乎不清楚参数是通过引用还是值传递,以下代码生成未更改的值'Original'
class PassByReference:
def __init__(self):
self.variable = 'Original'
self.change(self.variable)
print(self.variable)
def change(self, var):
var = 'Changed'
Run Code Online (Sandbox Code Playgroud)
有什么我可以通过实际参考传递变量吗?
我应该测试if某些东西是有效的还是只是try为了捕获异常?
例如,我应该:
if len(my_list) >= 4:
x = my_list[3]
else:
x = 'NO_ABC'
Run Code Online (Sandbox Code Playgroud)
要么:
try:
x = my_list[3]
except IndexError:
x = 'NO_ABC'
Run Code Online (Sandbox Code Playgroud)
一些想法......
PEP 20说:
错误不应该默默地传递.
除非明确沉默.
应该使用a try而不是if被解释为默认传递的错误?如果是这样,你是否通过这种方式使用它来明确地对它进行静音,从而使它成为可能?
我不是指的情况下,你只能做的事情1路; 例如:
try:
import foo
except ImportError:
import baz
Run Code Online (Sandbox Code Playgroud) 以下两个表达式似乎与我相同.哪个更好?
data = [('a', 1), ('b', 1), ('b', 2)]
d1 = {}
d2 = {}
for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)
Run Code Online (Sandbox Code Playgroud)
结果是一样的,但哪个版本更好或更富有pythonic?
就个人而言,我觉得版本2难以理解,因为对我而言,setdefault非常难以掌握.如果我理解正确,它会在字典中查找"key"的值,如果不可用,则在"dict"中输入"[]",返回对值或"[]"的引用,并在其中附加"val"参考.虽然顺利但它至少不是直观的(至少对我而言).
在我看来,版本1更容易理解(如果可用,获取"key"的值,如果没有,获取"[]",然后加入由[val]组成的列表并将结果放在"key"中).但是,虽然更直观地理解,但我担心这个版本的性能会降低,所有这些列表都会创建.另一个缺点是"d1"在表达式中出现两次,这是相当容易出错的.可能有一个更好的实现使用get,但目前它没有我.
我的猜测是版本2虽然对于没有经验的人来说更难掌握,但速度更快,因此更可取.意见?
我试图提供一个函数作为字典的get函数的默认参数,就像这样
def run():
print "RUNNING"
test = {'store':1}
test.get('store', run())
Run Code Online (Sandbox Code Playgroud)
但是,运行此命令时,它将显示以下输出:
RUNNING
1
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,正如标题所说,有一种方法可以提供一个callable作为get方法的默认值,如果密钥存在则不调用它?