Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
409780f8
Kaydet (Commit)
409780f8
authored
Ock 10, 1995
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
shallow and deep copy operations
üst
a48061a5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
240 additions
and
0 deletions
+240
-0
copy.py
Lib/copy.py
+240
-0
No files found.
Lib/copy.py
0 → 100644
Dosyayı görüntüle @
409780f8
# Generic (shallow and deep) copying operations
# =============================================
#
# The difference between shallow and deep copying is only relevant for
# compound objects (objects that contain other objects, like lists or class
# instances).
#
# - A shallow copy constructs a new compound object and then (to the extent
# possible) inserts *the same objects* into in that the original contains.
#
# - A deep copy constructs a new compound object and then, recursively,
# inserts *copies* into it of the objects found in the original.
#
# Two problems often exist with deep copy operations that don't exist with
# shallow copy operations:
#
# (a) recursive objects (compound objects that, directly or indirectly,
# contain a reference to themselves) may cause a recursive loop
#
# (b) because deep copy copies *everything* it may copy too much, e.g.
# administrative data structures that should be shared even between copies
#
# Python's deep copy operation avoids these problems by:
#
# (a) keeping a table of objects already copied during the current copying pass
#
# (b) letting user-defined classes override the copying operation or the set
# of components copied
#
# This version does not copy types like module, class, function, method,
# nor stack trace, stack frame, nor file, socket, window, nor array,
# nor any similar types.
import
types
Error
=
'copy.Error'
def
copy
(
x
):
try
:
copierfunction
=
_copy_dispatch
[
type
(
x
)]
except
KeyError
:
try
:
copier
=
x
.
__copy__
except
AttributeError
:
raise
Error
,
"un(shallow)copyable object of type
%
s"
%
type
(
x
)
y
=
copier
()
else
:
y
=
copierfunction
(
x
)
return
y
_copy_dispatch
=
d
=
{}
def
_copy_atomic
(
x
):
return
x
d
[
types
.
NoneType
]
=
_copy_atomic
d
[
types
.
IntType
]
=
_copy_atomic
d
[
types
.
LongType
]
=
_copy_atomic
d
[
types
.
FloatType
]
=
_copy_atomic
d
[
types
.
StringType
]
=
_copy_atomic
d
[
types
.
CodeType
]
=
_copy_atomic
d
[
types
.
TypeType
]
=
_copy_atomic
d
[
types
.
XRangeType
]
=
_copy_atomic
def
_copy_list
(
x
):
return
x
[:]
d
[
types
.
ListType
]
=
_copy_list
def
_copy_tuple
(
x
):
return
x
[:]
d
[
types
.
TupleType
]
=
_copy_tuple
def
_copy_dict
(
x
):
y
=
{}
for
key
in
x
.
keys
():
y
[
key
]
=
x
[
key
]
return
y
d
[
types
.
DictionaryType
]
=
_copy_dict
def
_copy_inst
(
x
):
if
hasattr
(
x
,
'__copy__'
):
return
x
.
__copy__
()
if
hasattr
(
x
,
'__getinitargs__'
):
args
=
x
.
__getinitargs__
()
else
:
args
=
()
y
=
apply
(
x
.
__class__
,
args
)
if
hasattr
(
x
,
'__getstate__'
):
state
=
x
.
__getstate__
()
else
:
state
=
x
.
__dict__
if
y
.
hasattr
(
'__setstate__'
):
y
.
__setstate__
(
state
)
else
:
for
key
in
state
.
keys
():
setattr
(
y
,
key
,
state
[
key
])
return
y
d
[
types
.
InstanceType
]
=
_copy_inst
del
d
def
deepcopy
(
x
,
memo
=
None
):
if
memo
is
None
:
memo
=
{}
d
=
id
(
x
)
if
memo
.
has_key
(
d
):
return
memo
[
d
]
try
:
copierfunction
=
_deepcopy_dispatch
[
type
(
x
)]
except
KeyError
:
try
:
copier
=
x
.
__deepcopy__
except
AttributeError
:
raise
Error
,
"un-deep-copyable object of type
%
s"
%
type
(
x
)
y
=
copier
(
memo
)
else
:
y
=
copierfunction
(
x
,
memo
)
memo
[
d
]
=
y
return
y
_deepcopy_dispatch
=
d
=
{}
def
_deepcopy_atomic
(
x
,
memo
):
return
x
d
[
types
.
NoneType
]
=
_deepcopy_atomic
d
[
types
.
IntType
]
=
_deepcopy_atomic
d
[
types
.
LongType
]
=
_deepcopy_atomic
d
[
types
.
FloatType
]
=
_deepcopy_atomic
d
[
types
.
StringType
]
=
_deepcopy_atomic
d
[
types
.
CodeType
]
=
_deepcopy_atomic
d
[
types
.
TypeType
]
=
_deepcopy_atomic
d
[
types
.
XRangeType
]
=
_deepcopy_atomic
def
_deepcopy_list
(
x
,
memo
):
y
=
[]
memo
[
id
(
x
)]
=
y
for
a
in
x
:
y
.
append
(
deepcopy
(
a
,
memo
))
return
y
d
[
types
.
ListType
]
=
_deepcopy_list
def
_deepcopy_tuple
(
x
,
memo
):
y
=
[]
for
a
in
x
:
y
.
append
(
deepcopy
(
a
,
memo
))
d
=
id
(
x
)
try
:
return
memo
[
d
]
except
KeyError
:
pass
for
i
in
range
(
len
(
x
)):
if
x
[
i
]
is
not
y
[
i
]:
return
tuple
(
y
)
return
x
d
[
types
.
TupleType
]
=
_deepcopy_tuple
def
_deepcopy_dict
(
x
,
memo
):
y
=
{}
memo
[
id
(
x
)]
=
y
for
key
in
x
.
keys
():
y
[
deepcopy
(
key
,
memo
)]
=
deepcopy
(
x
[
key
],
memo
)
return
y
d
[
types
.
DictionaryType
]
=
_deepcopy_dict
def
_deepcopy_inst
(
x
,
memo
):
if
hasattr
(
x
,
'__deepcopy__'
):
return
x
.
__deepcopy__
()
if
hasattr
(
x
,
'__getinitargs__'
):
args
=
x
.
__getinitargs__
()
args
=
deepcopy
(
args
,
memo
)
else
:
args
=
()
y
=
apply
(
x
.
__class__
,
args
)
memo
[
id
(
x
)]
=
y
if
hasattr
(
x
,
'__getstate__'
):
state
=
x
.
__getstate__
()
else
:
state
=
x
.
__dict__
state
=
deepcopy
(
state
,
memo
)
if
y
.
hasattr
(
'__setstate__'
):
y
.
__setstate__
(
state
)
else
:
for
key
in
state
.
keys
():
setattr
(
y
,
key
,
state
[
key
])
return
y
d
[
types
.
InstanceType
]
=
_deepcopy_inst
del
d
del
types
def
_test
():
l
=
[
None
,
1
,
2L
,
3.14
,
'xyzzy'
,
(
1
,
2L
),
[
3.14
,
'abc'
],
{
'abc'
:
'ABC'
},
(),
[],
{}]
l1
=
copy
(
l
)
print
l1
==
l
l1
=
map
(
copy
,
l
)
print
l1
==
l
l1
=
deepcopy
(
l
)
print
l1
==
l
class
C
:
def
__init__
(
self
,
arg
=
None
):
self
.
a
=
1
self
.
arg
=
arg
self
.
fp
=
open
(
'copy.py'
)
self
.
fp
.
close
()
def
__getstate__
(
self
):
return
{
'a'
:
self
.
a
,
'arg'
:
self
.
arg
}
def
__setstate__
(
self
,
state
):
for
key
in
state
.
keys
():
setattr
(
self
,
key
,
state
[
key
])
def
__deepcopy__
(
self
,
memo
=
None
):
new
=
self
.
__class__
(
deepcopy
(
self
.
arg
,
memo
))
new
.
a
=
self
.
a
return
new
c
=
C
(
'argument sketch'
)
l
.
append
(
c
)
l2
=
copy
(
l
)
print
l
==
l2
print
l
print
l2
l2
=
deepcopy
(
l
)
print
l
==
l2
print
l
print
l2
l
.
append
({
l
[
1
]:
l
,
'xyz'
:
l
[
2
]})
l3
=
copy
(
l
)
import
repr
print
map
(
repr
.
repr
,
l
)
print
map
(
repr
.
repr
,
l1
)
print
map
(
repr
.
repr
,
l2
)
print
map
(
repr
.
repr
,
l3
)
l3
=
deepcopy
(
l
)
import
repr
print
map
(
repr
.
repr
,
l
)
print
map
(
repr
.
repr
,
l1
)
print
map
(
repr
.
repr
,
l2
)
print
map
(
repr
.
repr
,
l3
)
if
__name__
==
'__main__'
:
_test
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment