python alias

Upload: pramod4yual

Post on 07-Apr-2018

253 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/6/2019 Python Alias

    1/52

    Python

    Copyright Software Carpentry 2010

    This work is licensed under the Creative Commons Attribution LicenseSee http://software-carpentry.org/license.html for more information.

  • 8/6/2019 Python Alias

    2/52

    An aliasis a second name for a piece of data

    Python Aliasing

  • 8/6/2019 Python Alias

    3/52

    An aliasis a second name for a piece of dataOften easier (and more useful) than making a

    Python Aliasing

  • 8/6/2019 Python Alias

    4/52

    An aliasis a second name for a piece of dataOften easier (and more useful) than making a

    If the data is immutable, aliases don't matter

    Python Aliasing

  • 8/6/2019 Python Alias

    5/52

    An aliasis a second name for a piece of dataOften easier (and more useful) than making a

    If the data is immutable, aliases don't matter

    Because the data can't change

    Python Aliasing

  • 8/6/2019 Python Alias

    6/52

  • 8/6/2019 Python Alias

    7/52

    Aliasing happens whenever one variable's valueis assigned to another variable

    Python Aliasing

  • 8/6/2019 Python Alias

    8/52

    ' '

    Aliasing happens whenever one variable's valueis assigned to another variable

    variablevariablevariablevariable valuevaluevaluevalue

    Python Aliasing

    first 'isaac'

  • 8/6/2019 Python Alias

    9/52

    ' '

    Aliasing happens whenever one variable's valueis assigned to another variable

    second = first

    variablevariablevariablevariable valuevaluevaluevalue

    Python Aliasing

    first

    second

    'isaac'

  • 8/6/2019 Python Alias

    10/52

    ' '

    Aliasing happens whenever one variable's valueis assigned to another variable

    second = first

    variablevariablevariablevariable valuevaluevaluevalue

    But as we've already seen

    Python Aliasing

    first

    second

    'isaac'

  • 8/6/2019 Python Alias

    11/52

    ' '

    Aliasing happens whenever one variable's valueis assigned to another variable

    second = first

    variablevariablevariablevariable valuevaluevaluevaluefirst = first + ' newton'

    But as we've already seen

    Python Aliasing

    first

    second

    'isaac'

    'isaac newton'

  • 8/6/2019 Python Alias

    12/52

    But lists are mutable

    Python Aliasing

  • 8/6/2019 Python Alias

    13/52

    But lists are mutable

    first = ['isaac']

    variablevariablevariablevariable valuevaluevaluevalue

    first

    Python Aliasing

    'isaac'

  • 8/6/2019 Python Alias

    14/52

    But lists are mutable

    first = ['isaac']

    =

    variablevariablevariablevariable valuevaluevaluevalue

    first

    Python Aliasing

    second

    'isaac'

  • 8/6/2019 Python Alias

    15/52

    But lists are mutable

    first = ['isaac']

    =

    variablevariablevariablevariable valuevaluevaluevalue

    first

    first = first.append('newton')

    printprintprintprint first

    ['isaac', 'newton']

    Python Aliasing

    second

    'isaac' 'newton'

  • 8/6/2019 Python Alias

    16/52

    But lists are mutable

    first = ['isaac']

    =

    first = first.append('newton')

    printprintprintprint first

    ['isaac', 'newton']

    printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue

    first

    Python Aliasing

    second

    'isaac' 'newton'

  • 8/6/2019 Python Alias

    17/52

    But lists are mutable

    first = ['isaac']

    =

    first = first.append('newton')

    printprintprintprint first

    ['isaac', 'newton']

    printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue

    first

    Python Aliasing

    second

    'isaac' 'newton'

    n t exp c t ymodify second

  • 8/6/2019 Python Alias

    18/52

    But lists are mutable

    first = ['isaac']

    =

    first = first.append('newton')

    printprintprintprint first

    ['isaac', 'newton']

    printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue

    first

    Python Aliasing

    second

    'isaac' 'newton'

    n t exp c t ymodify second

    A side effect

  • 8/6/2019 Python Alias

    19/52

    Example: use lists of liststo implement a 2D grid

    Python Aliasing

  • 8/6/2019 Python Alias

    20/52

    3

    Example: use lists of liststo implement a 2D grid

    7

    5

    5

    2

    6

    7 5 8

    5 6 3

    3 2 4

    Python Aliasing

    8

    4

    3

  • 8/6/2019 Python Alias

    21/52

    3

    Example: use lists of liststo implement a 2D grid

    7

    5

    5

    2

    6

    7 5 8

    5 6 3

    3 2 4

    grid

    Python Aliasing

    8

    4

    3

  • 8/6/2019 Python Alias

    22/52

    3

    Example: use lists of liststo implement a 2D grid

    7

    5

    5

    2

    6

    7 5 8

    5 6 3

    3 2 4

    grid[0]

    Python Aliasing

    8

    4

    3

  • 8/6/2019 Python Alias

    23/52

    3

    Example: use lists of liststo implement a 2D grid

    7

    5

    5

    2

    6

    7 5 8

    5 6 3

    3 2 4

    grid[0][1]

    Python Aliasing

    8

    4

    3

  • 8/6/2019 Python Alias

    24/52

    # Correct code

    grid = []

    forforforfor x inininin range(N):

    temp = []

    forforforfor y inininin range(N):

    temp.append(1)

    grid.append(temp)

    Python Aliasing

  • 8/6/2019 Python Alias

    25/52

    # Correct code

    grid = []

    forforforfor x inininin range(N):

    temp = []

    Outer "spine" of structure

    forforforfor y inininin range(N):

    temp.append(1)

    grid.append(temp)

    Python Aliasing

  • 8/6/2019 Python Alias

    26/52

    # Correct code

    grid = []

    forforforfor x inininin range(N):

    temp = []

    forforforfor y inininin range(N):

    temp.append(1)

    grid.append(temp)

    Add N sub-lists to outer list

    Python Aliasing

  • 8/6/2019 Python Alias

    27/52

    # Correct code

    grid = []

    forforforfor x inininin range(N):

    temp = []

    forforforfor y inininin range(N):

    temp.append(1)

    grid.append(temp)

    Create a sublist of N 1's

    Python Aliasing

  • 8/6/2019 Python Alias

    28/52

    # Equivalent code

    grid = []

    forforforfor x inininin range(N):

    grid.append([])

    forforforfor y inininin range(N):

    grid[-1].append(1)

    Python Aliasing

  • 8/6/2019 Python Alias

    29/52

    # Equivalent code

    grid = []

    forforforfor x inininin range(N):

    grid.append([])

    forforforfor y inininin range(N):

    grid[-1].append(1)

    Last element of outer list is the sublist currently

    Python Aliasing

    e ng e n

  • 8/6/2019 Python Alias

    30/52

    # Incorrect code

    grid = []

    EMPTY = []

    forforforfor x inininin range(N):

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    Python Aliasing

  • 8/6/2019 Python Alias

    31/52

    # Incorrect code

    grid = []

    EMPTY = []

    forforforfor x inininin range(N):

    # Equivalent code

    grid = []

    forforforfor x inininin range(N):

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    grid.append([])

    forforforfor y inininin range(N):

    grid[-1].append(1)

    Python Aliasing

  • 8/6/2019 Python Alias

    32/52

    # Incorrect code

    grid = []

    EMPTY = []

    forforforfor x inininin range(N):

    Aren't meaningful variable

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    a good thing?

    Python Aliasing

  • 8/6/2019 Python Alias

    33/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 0

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    grid

    EMPTY

    Python Aliasing

  • 8/6/2019 Python Alias

    34/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 0

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    grid

    EMPTY

    Python Aliasing

  • 8/6/2019 Python Alias

    35/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 0

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    EMPTY

    0

    Python Aliasing

  • 8/6/2019 Python Alias

    36/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 0

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    EMPTY

    0

    Python Aliasing

    1

  • 8/6/2019 Python Alias

    37/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 0

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    EMPTY

    2

    Python Aliasing

    1 1 1

  • 8/6/2019 Python Alias

    38/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 1

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    EMPTY

    2

    Python Aliasing

    1 1 1

  • 8/6/2019 Python Alias

    39/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    EMPTY = []

    x 1

    grid.append(EMPTY)

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    EMPTY

    2

    Python Aliasing

    1 1 1

    You see the problem...

  • 8/6/2019 Python Alias

    40/52

    No Aliasing

    second = []

    Python Aliasing

  • 8/6/2019 Python Alias

    41/52

    No Aliasing Aliasing

    second = [] second = first

    Python Aliasing

  • 8/6/2019 Python Alias

    42/52

  • 8/6/2019 Python Alias

    43/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    forforforfor x inininin range(N):

    x 0

    .

    forforforfor y inininin range(N):

    grid[-1].append(1)grid

    Python Aliasing

  • 8/6/2019 Python Alias

    44/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    forforforfor x inininin range(N):

    x 0

    .

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    2

    Python Aliasing

    1 1 1

  • 8/6/2019 Python Alias

    45/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    forforforfor x inininin range(N):

    x 1

    .

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    2

    Python Aliasing

    1 1 1

  • 8/6/2019 Python Alias

    46/52

    variablevariablevariablevariable valuevaluevaluevalue

    grid = []

    forforforfor x inininin range(N):

    x 1

    .

    forforforfor y inininin range(N):

    grid[-1].append(1)

    y

    grid

    0

    Python Aliasing

    1 1 1

    1

  • 8/6/2019 Python Alias

    47/52

    If aliasing can cause bugs, why allow it?

    Python Aliasing

  • 8/6/2019 Python Alias

    48/52

    If aliasing can cause bugs, why allow it?

    1. Some languages don't

    Python Aliasing

  • 8/6/2019 Python Alias

    49/52

    If aliasing can cause bugs, why allow it?

    1. Some languages don't

    Python Aliasing

  • 8/6/2019 Python Alias

    50/52

    If aliasing can cause bugs, why allow it?

    1. Some languages don't

    2. Aliasing a million-element list is more efficient

    than copying it

    Python Aliasing

  • 8/6/2019 Python Alias

    51/52

    If aliasing can cause bugs, why allow it?

    1. Some languages don't

    2. Aliasing a million-element list is more efficient

    than copying it

    3. Sometimes really do want to update a structure

    Python Aliasing

  • 8/6/2019 Python Alias

    52/52

    created by

    Greg Wilson

    c o er

    Copyright Software Carpentry 2010

    This work is licensed under the Creative Commons Attribution License

    See http://software-carpentry.org/license.html for more information.