了解Python中的setdefault

时间:2015-08-23 16:33:21

标签: python

我很难理解我的代码中发生了什么。所以,如果我有以下一行:

d = {}
d.setdefault("key",[]).append("item")

返回

{'key': ['item']}

所以我得到setdefault所做的。它检查"key"中的d,一个字典,如果它不存在,则创建它,否则如果它存在,则返回该值。这将返回一个可以操作的副本,并将在原始字典中更新。这对我来说是一个新想法。这是否意味着setdefault返回深拷贝,而不是浅拷贝?试图围绕这个浅拷贝与深拷贝进行包围。

1 个答案:

答案 0 :(得分:2)

没有Python操作进行隐式复制。永远。就Python而言,隐式复制是邪恶的。

创建对象的文字。每次调用setdefault时,它都会计算其参数。当它评估第二个参数(try { InputStream p12InputSream; HttpTransport httpTransport; File tempFile; p12InputSream = resourceLoader.getResource("classpath:google-auth.p12").getInputStream(); tempFile = File.createTempFile("temp", "temp"); IOUtils.copy(p12InputSream, new FileOutputStream(tempFile)); httpTransport = GoogleNetHttpTransport.newTrustedTransport(); JsonFactory jsonFactory = new JacksonFactory(); List<String> scopes = new ArrayList<>(); scopes.add(StorageScopes.CLOUD_PLATFORM); scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL); Credential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId("157264856793-sl14obknv58bi73m2co92oabrara9l8c@developer.gserviceaccount.com") .setServiceAccountPrivateKeyFromP12File(tempFile) .setServiceAccountScopes(scopes) .build(); storage = new Storage.Builder(httpTransport, jsonFactory, credential).setApplicationName("nitro-login").build(); InputStreamContent content = new InputStreamContent(mpf.getContentType(), mpf.getInputStream()); StorageObject metaData = new StorageObject().setName(filename); Storage.Objects.Insert insert = storage.objects().insert("nitro-resources", metaData, content); insert.execute(); catch (Exception ex) {} )时,会创建一个新列表。它与[]完全相同。

如果你写了a = [],然后在某个词典中多次尝试el = [] .setdefault,那么你就会发现没有制作副本。