https://docs.python.jp/3/library/copy.html
Gibt eine flache Kopie von x zurück.
Es gibt kein "Wie". Mit anderen Worten, die Spezifikationen sind nicht wirklich geschrieben.
Spezielle Methoden
__copy__ ()
und__deepcopy__ ()
können definiert werden, um eine klassenspezifische Kopierimplementierung zu definieren.
Gibt es diese Methode in der Liste?
>>> lst = [1, 2, 3]
>>> lst.__copy__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute '__copy__'
Das gibt es nicht.
Unten finden Sie die Implementierung von copy.copy ()
in Python 3.6.1.
def copy(x):
"""Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
"""
cls = type(x)
copier = _copy_dispatch.get(cls)
if copier:
return copier(x)
try:
issc = issubclass(cls, type)
except TypeError: # cls is not a class
issc = False
if issc:
# treat it as a regular class:
return _copy_immutable(x)
copier = getattr(cls, "__copy__", None)
if copier:
return copier(x)
reductor = dispatch_table.get(cls)
if reductor:
rv = reductor(x)
else:
reductor = getattr(x, "__reduce_ex__", None)
if reductor:
rv = reductor(4)
else:
reductor = getattr(x, "__reduce__", None)
if reductor:
rv = reductor()
else:
raise Error("un(shallow)copyable object of type %s" % cls)
if isinstance(rv, str):
return x
return _reconstruct(x, None, *rv)
_copy_dispatch = d = {}
def _copy_immutable(x):
return x
for t in (type(None), int, float, bool, complex, str, tuple,
bytes, frozenset, type, range, slice,
types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented),
types.FunctionType, weakref.ref):
d[t] = _copy_immutable
t = getattr(types, "CodeType", None)
if t is not None:
d[t] = _copy_immutable
d[list] = list.copy
d[dict] = dict.copy
d[set] = set.copy
d[bytearray] = bytearray.copy
...
copy.copy ()
enthält eine Funktion im Wörterbuch, die im Voraus eine flache Kopie (und eine tiefe Kopie) in jedem integrierten Datentyp realisiert. Wenn sie nicht in diesem Wörterbuch registriert ist, wird die Methode__copy__ ()
verwendet Suchen.
Danach scheint es sich basierend auf den Konventionen zu verhalten, die sich auf das "pickle" -Modul beziehen, aber es wird weggelassen, weil es die Annahmen dieses Artikels überschreitet. Entspricht dem folgenden Teil des Dokuments:
Klassen können dieselbe Schnittstelle verwenden, über die Pickle gesteuert wird, um das Kopieren zu steuern. Informationen zu diesen Methoden finden Sie in der Beschreibung des Modul-Pickles. Tatsächlich verwendet das Kopiermodul die vom Kopierregulierungsmodul registrierte Picle-Funktion.
Abgesehen davon betrachtet der Quellcode "copy.copy (lst)" als äquivalent zu "lst.copy ()".
Übrigens gibt es in Python 2 keine "list.copy ()", und stattdessen wird "lst [:]" verwendet. Möglicherweise wird "lst [:]" relativ häufig in älteren Dokumenten angezeigt, die von 2 auf 3 migriert wurden.
Recommended Posts