Python Interview
https://github.com/leisurelicht/wtfpython-cn
Datatype
All problems about datatype.
Shallow-copy and Deep-copy
When it comes to deep copy and shallow copy, the differences can be compared based on data types, copy principles, and copy functions. Here is a table in Markdown format that summarizes the differences between deep copy and shallow copy:
Deep Copy | Mutable and Immutable Data Types | Create a new object and recursively copy all nested objects of the original object. The new object is completely independent from the original object, and modifications to the copy won't affect the original object. |
|
Shallow Copy | Mutable Data Types | Create a new object where a part of it shares the same reference as the original object. Only the first level of the original object is copied, and nested objects are still shared. Modifications to the copy will affect the original object. |
|
Immutable Data Types | Not applicable | Not applicable | Not applicable |
Strings, Numbers, and other Immutable Objects | Whether it's a deep copy or shallow copy, a new object will be created. However, for immutable objects that cannot be modified, there is no difference between deep copy and shallow copy. |
This table provides an overview of the differences between deep copy and shallow copy based on different data types, copy principles, and the use of copy functions. Please note that the mentioned copy functions refer to the copy module provided by the Python standard library.
Following is code about this feature:
import copy
nested_array = [1, 2, 7, [4, 9, 6]]
shallow_copy = copy.copy(nested_array)
deep_copy = copy.deepcopy(nested_array)
# Original array: [1, 2, 7, [4, 9, 6]] 2456116559808
print("Original array:", nested_array, id(nested_array), "\n")
# Shallow copy before modifying: [1, 2, 7, [4, 9, 6]] 140724048356296
print("Shallow copy before modifying:", shallow_copy, id(shallow_copy[3]), "\n")
nested_array[3].append(512)
# Shallow copy after modifying: [1, 2, 7, [4, 9, 6, 512]] 140724048356296
print("Shallow copy after modifying:", shallow_copy, id(shallow_copy[3]), "\n")
# original array: [1, 2, 7, [4, 9, 6]] 2456116539264
print("Original array:", deep_copy, id(deep_copy), "\n")
nested_array[3][2] = 1024
# Original array after modifying by deep copying: [1, 2, 7, [4, 9, 1024, 512]] 2456116559808
print("Original array after modifying by deep copying:", nested_array, id(nested_array), "\n")
# original array after deep copying: [1, 2, 7, [4, 9, 6]] 2456116539264
print("Original array after deep copying:", deep_copy, id(deep_copy), "\n")
unconspicuous shallow copying
>>> row = [""] * 3 >>> board = [row] * 3 >>> board [['', '', ''], ['', '', ''], ['', '', '']] >>> board[0][0] '' >>> board[0][0] = "X" >>> board [['X', '', ''], ['X', '', ''], ['X', '', '']]
To avoid this problem, we can initialize a grid, and instantly modify the value of [0][0].
board = [[""] * 3 for _ in range(3)] board[0][0] = "X" print(board)
small integer caching
Original: Pylong_Fromlong
Quote: The reason of small integer caching
The range of caching is from -5 to 256. And the meaning of is mean to varaibles which possessed the same memory address. So, for those caching integer number, they are assigned memory address in advance. When we use assignment statement to assign number for variables, those variables will get the same memory address for the same value.
a, b = 256, 256
for i in range(250, 260):
if a is not b:
break
a += 1
b += 1
print("start point: ", a, "end point:", b) # a = b = 257
dict or set
uniqueness of the key's logic
Althogh there are three object, such as number, complex, and float number, those objects have the same logic value.
>>> collections = dict() >>> temporary = 5 + 0j >>> collections[5] = "Dog" >>> collections[5] 'Dog' >>> collections[5.0] = "Pear" >>> collections[5.0] 'Pear' >>> collections[temporary] = "King" >>> collections[temporary] 'King' >>> collections[5] 'King' >>> collections[5.0] 'King' >>> collections[temporary] 'King'
Operator
all about operator in python.
walrus operator
version: Python 3.8
PEP No: 572
Function
try-except
- The return value is determined by the last return sentence.
- The
finallysentence will be definitely be executed. - The interactive interface gives the output, but the
IDEmaybe gives output.
def simple():
try:
# return 10086
return "from try"
finally:
# return 1024
return "from finally"
def asceticism():
for _ in range(3):
try:
continue
finally:
print(10000)
def complex():
try:
for i in range(3):
try:
1 / i
except ZeroDivisionError:
raise ZeroDivisionError("Invalid value")
finally:
print("Normal", i)
break
except ZeroDivisionError as e:
print("Zero devision error occured", e)
reassign value
array = [1, 2, 5] g = (x for x in array if array.count(x) > 0) array = [9, 2, 4] print(list(g))#我的实习求职记录#

