Python 函数调用值的问题

Posted by kifish on November 2, 2017

可以看看:http://www.cnblogs.com/yuyan/archive/2012/04/21/2461673.html

http://www.cnblogs.com/CheeseZH/p/5165283.html

import numpy as np

def build_chessboard(N):
    chessboard = np.zeros((N,N))
    return chessboard

def print_chessboard(chessboard):
    N = len(chessboard)
    for r in range(N):
        for c in range(N):
            if chessboard[r,c] == 1:
                print ('Q', end="")
            else:
                print ('.', end="")
        print ()
    print ()

# generate an empty 4x4 chessboard:
chessboard = build_chessboard(4)
print (chessboard)

# Place 4 non-attacking queens on this board
chessboard[1,0] = 1
chessboard[3,1] = 1
chessboard[0,2] = 1
chessboard[2,3] = 1

# Pretty print the resulting board
print_chessboard(chessboard)



def test(cb):
    cb[0, 0] = 1
    print_chessboard(cb)


chessboard = build_chessboard(4)
print_chessboard(chessboard)
test(chessboard.copy())  # try chessboard.copy() instead
print_chessboard(chessboard)  # oooops!


def test(b):
    b = b + 1
    print(b)
n = 1
print(n)
test(n)
print(n)

import copy


def test(b):
    b.append(1)
    print(b)


n = [1, 2, 3]
print(n)
test(copy.copy(n))
print(n)
test(n)
print(n)


a=[]
copy.deepcopy(a)

import copy

# copy makes a copy of the outer-most object, but keeps the same references to the inner
# object.
a=[2,4,[6]]
print ("before: a=", a)

b=copy.copy(a)
b[0]+=1
b[2][0]+=1

print ("after: a=",a," b=", b, " (using copy)")

# deepcopy also makes a copy of each contained element (recursively)
a=[2,4,[6]]
b=copy.deepcopy(a)
b[0]+=1
b[2][0]+=1
print ("after: a=",a," b=", b, " (using deepcopy)")

总结一下:函数调用(不可变对象)不可以改变原值(类似值传递的时候),但可以改变可变对象(如list)。deepcopy比copy安全,因为不会保留内层引用(copy,内层引用可能会导致内层值被修改)

n皇后问题中,count是数,相当于值传递,无法改变。可以改成列表。