我很难理解我的代码中发生了什么。所以,如果我有以下一行:
d = {}
d.setdefault("key",[]).append("item")
返回
{'key': ['item']}
所以我得到setdefault
所做的。它检查"key"
中的d
,一个字典,如果它不存在,则创建它,否则如果它存在,则返回该值。这将返回一个可以操作的副本,并将在原始字典中更新。这对我来说是一个新想法。这是否意味着setdefault返回深拷贝,而不是浅拷贝?试图围绕这个浅拷贝与深拷贝进行包围。
答案 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
,那么你就会发现没有制作副本。