如果使用kwargs
更新字典键确实有真正的优势,我会感到困惑。请遵循以下示例:
def example():
return {'a':1,'b':2,'c':3}
使用kwargs
更新字典:
{**example(),'b':9}
>> {'a': 1, 'b': 9, 'c': 3}
我还可以使用类似的东西:
example['b'] = 9
有人可以告诉我使用解压缩方法更新dict
或给我一些阅读材料的好处吗? E特别是在涉及嵌套字典时,因为这是我看到的地方。
答案 0 :(得分:1)
{**example(),'b':9}
通过解压缩example()
返回的字典,然后用键b
更新新字典来创建新字典,而example['b'] = 9
更新键{{1 }} b
就位,并且不会创建新的dict。
答案 1 :(得分:0)
我认为您正在将 private void createCameraPreviewSessionLocked() {
try {
SurfaceTexture texture = mPreviewView.getSurfaceTexture();
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = mBackCameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mBackCameraDevice.createCaptureSession(Arrays.asList(
surface,
mJpegImageReader.get().getSurface(),
mRAWImageReader.get().getSurface(),
persistentRecorderSurface
), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
synchronized (mCameraStateLock) {
if (mBackCameraDevice == null) {
return;
}
try {
setup3AControlsLocked(mPreviewRequestBuilder);
session.setRepeatingRequest(mPreviewRequestBuilder.build(),
mPreCaptureCallback, mBackgroundHandler);
mState = CameraStates.PREVIEW;
} catch (CameraAccessException | IllegalStateException e) {
e.printStackTrace();
return;
}
mSession = session;
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
showToast("Failed to configure camera.");
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
函数参数与**
的解压缩方法混淆。 **kwargs
只是将**
返回的字典解压缩为键/值对,然后使用传递给字典构造函数的附加键/值对example()
创建新的字典。
如果您一次只添加一个键/值对,那么此方法仅像'b':9
这样分配就没有太大的价值,但是如果您想将两个字典合并为一个字典,那么执行example['b'] = 9
然后遍历并将两个字典中的每个键/值对添加到新字典中会更加有效。
此方法仅适用于Python 3.5及更高版本(使用new_dict = {**old_dict, **old_dict1}
的早期版本)。这里还有更多code关于python解包方法和kwarg的信息。